The use of transactional memory is desirable from a programmer's perspective, but implementing hardware transactional memory can be taxing on conventional processors. To support the execution of concurrent transactions, a processor must track a large number of reads and writes performed by a given transaction. The reads performed by the transaction (“read-set”) and the writes performed by the transaction (“write-set”) are checked against the read-sets and the write-sets of other concurrently executing transactions for conflicts indicating atomicity violations.
In conventional processors, hardware transactional memory may be implemented as follows: a transaction's read-set is recorded in the processor's load buffer, while its write-set is recorded in the processor's store buffer. Whenever a transaction performs a write, a request is initiated that checks the read-set and write-set of other concurrently executing transactions by searching for a match in their load buffer and store buffer respectively. The checking of the transaction's read-set and write-set for a match must be performed in a timely manner. As the size of the read-set and the write-set of the transaction increases in size, the ability to search in a timely manner is compromised.